﻿// 10002 喷水装置.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;


/*
https://loj.ac/p/10002

题目描述
Source: UVa 10382

长 L 米，宽 W 米的草坪里装有 n 个浇灌喷头。每个喷头都装在草坪中心线上（离两边各W\2 米）。
我们知道每个喷头的位置（离草坪中心线左端的距离），以及它能覆盖到的浇灌范围。

请问：如果要同时浇灌整块草坪，最少需要打开多少个喷头？
n<= 15000
输入格式
输入包含若干组测试数据。

第一行一个整数 T 表示数据组数；

每组数据的第一行是整数 n、L 和 W；

接下来的 n 行，每行包含两个整数，给出一个喷头的位置和浇灌半径（上面的示意图是样例输入第一组数据所描述的情况）。

输出格式
对每组测试数据输出一个数字，表示要浇灌整块草坪所需喷头数目的最小值。如果所有喷头都打开也不能浇灌整块草坪，则输出 -1 。

输入
3
8 20 2
5 3
4 1
1 2
7 2
10 2
13 3
16 2
19 4
3 10 1
3 5
9 3
6 1
3 10 1
5 3
1 1
9 1

输出
6
2
-1
*/

const int N = 15010;
pair<double, double> seg[N];
int n, t, l, w;


void solve() {
	cin >> n >> l >> w;
	int tol = 0;
	for (int i = 0; i < n; i++) {
		int p, ri; cin >> p >> ri;
		if (ri * ri * 1.0  <=  w * w / 4.0) { continue; }
		double len = sqrt(ri * ri * 1.0 - w * w / 4.0);
		//if (len <= 0.0) continue;
		double l = p - len;
		double r = p + len;
		//cout << l  <<" " <<r << endl;
		seg[tol++] = { l,r };
	}
	sort(seg,seg+tol);

	double curr = 0.0; double maxr = 0.0;
	int ans = 0; int currIdx = -1;
	while (curr < l) {
		int hasnoanswer = 1;
		for (int i = currIdx+1; i < tol; i++) {
			if (seg[i].first <= curr && seg[i].second > maxr) {
				maxr = seg[i].second;
				currIdx = i;
				hasnoanswer = 0;
			}
		}
		curr = maxr;
		maxr = 0.0;
		if (0 == hasnoanswer) { ans++; }
		else { ans = -1; break; }
	}

	cout << ans << endl;
}

int main()
{
	cin >> t;
	while (t--) {
		solve();
	}

	return 0;
}

 